home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / pvm34b3.zip / pvm34b3 / pvm3 / gexamples / ge.c < prev    next >
C/C++ Source or Header  |  1997-07-22  |  4KB  |  135 lines

  1.  
  2. static char rcsid[] =
  3.     "$Id: ge.c,v 1.2 1997/07/09 13:27:56 pvmsrc Exp $";
  4.  
  5. /*
  6.  *         PVM version 3.4:  Parallel Virtual Machine System
  7.  *               University of Tennessee, Knoxville TN.
  8.  *           Oak Ridge National Laboratory, Oak Ridge TN.
  9.  *                   Emory University, Atlanta GA.
  10.  *      Authors:  J. J. Dongarra, G. E. Fagg, M. Fischer
  11.  *          G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
  12.  *         P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
  13.  *                   (C) 1997 All Rights Reserved
  14.  *
  15.  *                              NOTICE
  16.  *
  17.  * Permission to use, copy, modify, and distribute this software and
  18.  * its documentation for any purpose and without fee is hereby granted
  19.  * provided that the above copyright notice appear in all copies and
  20.  * that both the copyright notice and this permission notice appear in
  21.  * supporting documentation.
  22.  *
  23.  * Neither the Institutions (Emory University, Oak Ridge National
  24.  * Laboratory, and University of Tennessee) nor the Authors make any
  25.  * representations about the suitability of this software for any
  26.  * purpose.  This software is provided ``as is'' without express or
  27.  * implied warranty.
  28.  *
  29.  * PVM version 3 was funded in part by the U.S. Department of Energy,
  30.  * the National Science Foundation and the State of Tennessee.
  31.  */
  32.  
  33. /*
  34.     Typical group example
  35.  
  36.     20 Mar 1993, modified example to reflect change in pvm_bcast()
  37. */
  38.  
  39. #include <stdio.h>
  40. #include "pvm3.h"
  41.  
  42. int
  43. main(argc, argv)
  44. int argc;
  45. char *argv[];
  46. {
  47.     int mytid, mygid, ctid[32];
  48.     int nproc, i, indx;
  49.     int cc;
  50.  
  51.     mytid = pvm_mytid();
  52.     fprintf(stderr, "%s 0x%x enrolled\n", "ge", mytid);
  53.     if (mytid < 0) {
  54.         pvm_perror(argv[0]);
  55.         return -1;
  56.         }
  57.  
  58.     if (pvm_parent() == PvmNoParent) {
  59.         if (argc != 2) goto usage;
  60.         if ((nproc = atoi(argv[1])) < 0) goto usage;
  61.         if (nproc > 32) goto usage;
  62.         }
  63.  
  64.     /* join a group */
  65.     mygid = pvm_joingroup("ge");
  66.     fprintf(stderr, "%s 0x%x %d\n", "ge", mytid, mygid);
  67.  
  68.     /* if I'm the first to join then start the others */
  69.     if (mygid == 0) {
  70.         /* start a bunch of children */
  71.         if ((nproc-1) != pvm_spawn(argv[0], (char**) 0, 0, "", nproc-1, ctid))
  72.             pvm_perror("spawn1");
  73.         /* check them */
  74.         for (i = 0; i < nproc-1; i++)
  75.             fprintf(stderr, "0x%x\n", ctid[i]);
  76.         /* tell them how many sibs */
  77.         pvm_initsend(PvmDataDefault);
  78.         pvm_pkint(&nproc, 1, 1);
  79.         pvm_mcast(ctid, nproc-1, 15);
  80.         }
  81.     else {
  82.         /* find out the number of sibs */
  83.         pvm_recv(pvm_parent(), 15);
  84.         pvm_upkint(&nproc, 1, 1);
  85.         fprintf(stderr,"nproc %d\n",nproc);
  86.         }
  87.  
  88.     /* sync on a barrier */
  89.     if (pvm_barrier("ge", nproc) < 0) {
  90.         pvm_perror("barrier");
  91.         pvm_lvgroup("ge");
  92.         pvm_exit();
  93.         return -1;
  94.         }
  95.  
  96.     fprintf(stderr, "group %s size %d gid %d: sync\n", "ge", 
  97.         pvm_gsize("ge"), mygid);
  98.  
  99.     /* everyone broadcast their gids and tids */
  100.     pvm_initsend(PvmDataDefault);
  101.     pvm_pkint(&mygid, 1, 1);
  102.     pvm_pkint(&mytid, 1, 1);
  103.     pvm_bcast("ge", 63);
  104.  
  105.     /* recv all the gids and tids (except from myself) */
  106.     for (i = 0; i < nproc-1; i++) {
  107.         pvm_recv(-1, 63);
  108.         pvm_upkint(&indx, 1, 1);
  109.         pvm_upkint(ctid+indx, 1, 1);
  110.         }
  111.     /* set my tid too */
  112.     ctid[mygid] = mytid;
  113.  
  114.     /* check to make sure the gids and tids are correct */
  115.     for (i = 0; i < nproc; i++) {
  116.         if (i != pvm_getinst("ge", ctid[i])) {
  117.             fprintf(stderr, "gid %d doesn't match up!\n", i);
  118.             }
  119.         if (ctid[i] != pvm_gettid("ge", i)) {
  120.             fprintf(stderr, "gid %d doesn't match up!\n", i);
  121.             }
  122.         }
  123.  
  124.     /* leave the group */
  125.     if(pvm_lvgroup("ge") < 0)
  126.             pvm_perror("leave");
  127.     pvm_exit();
  128.     printf("done\n");
  129.     return 0;
  130. usage:
  131.     pvm_exit();
  132.     fprintf(stderr, "usage: %s <nproc>\n", argv[0]);
  133.     return -1;
  134. }
  135.